﻿#define _CRT_SECURE_NO_WARNINGS 

#include <stdio.h>

//int main()
//{
//	int a = 10000;
//	FILE* pf = fopen("test.txt", "wb");
//	fwrite(&a, 4, 1, pf);//⼆进制的形式写到⽂件中 
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//
//struct _iobuf {
//	char* _ptr;
//	int _cnt;
//	char* _base;
//	int _flag;
//	int _file;
//	int _charbuf;
//	int _bufsiz;
//	char* _tmpfname;
//};s
//typedef struct _iobuf FILE;

//int main()
//{
//	//以读的形式打开文件
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}
//int fputc(int character, FILE* stream);

//int main()
//{
//	//打开文件
//	FILE* pf = fopen("test.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//
//	//写文件
//	for (char ch = 'a'; ch <= 'z'; ch++)
//	{
//		fputc(ch, pf);
//	}
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
//


//int main()
//{
//	//打开文件
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//
//	//读文件
//	int ch = 0;
//	while ((ch = fgetc(pf)) != EOF)
//	{
//		printf("%c", ch);
//	}
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
//


//int main()
//{
//	//打开文件
//	FILE* pf = fopen("test.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//
//	//写文件
//	fputs("hello\n", pf);
//	fputs("world!\n", pf);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
//


//int main()
//{
//	//打开文件
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//
//	//读文件
//	//定义一个长度为20的字符数组，用于存储每次读取的内容
//	char arr[20] = { 0 };
//	while (fgets(arr, 20, pf) != NULL)
//	{
//		printf("%s",arr);
//	}
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
//


//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//
//int main()
//{
//	struct S s = { "张三",20,65.5f };
//	//想把S中的数据写入文件中
//	//打开文件
//	FILE* pf = fopen("test.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//
//	//写文件
//	fprintf(pf, "%s %d %f", s.name, s.age, s.score);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//
//int main()
//{
//	struct S s = { 0 };
//	//想从test.txt文件中读取数据放在s中
//	//打开文件
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//
//	//读文件
//	fscanf(pf, "%s %d %f", s.name, &s.age, &s.score);
//
//	//打印观察
//	//printf("%s %d %f\n", s.name, s.age, s.score);
//	fprintf(stdout, "%s %d %f\n", s.name, s.age, s.score);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	fputc('a', stdout);
//	return 0;
//}


#include<stdlib.h>
//排序整型数组
 
//比较函数
//int cmp_int(const void* p1, const void* p2)
//{
//	return *(int*)p1 - *(int*)p2;//升序
//}
//
//int main()
//{
//	int arr[10] = { 2,6,7,1,8,9,10,5,4,3 };
//	int len = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, len, sizeof(arr[0]), cmp_int);
//
//	for (int i = 0; i < len; i++)
//	{
//		printf("%d ",arr[i]);
//	}
//	return 0;
//}


//比较函数
//int cmp_int(const void* p1, const void* p2)
//{
//	return *(int*)p1 - *(int*)p2;
//}
//
////交换函数
//void Swap(char* buf1, char* buf2, size_t width)
//{
//	//一次交换一个字节（可能是字符）
//	for (int i = 0; i < width; i++)
//	{
//		char tmp = *buf1;
//		*buf1 = *buf2;
//		*buf2 = tmp;
//		buf1++;
//		buf2++;
//	}
//}
//
////模拟qsort函数
//void my_qsort(void* base, size_t len, size_t width, int(*cmp)(const void* p1, const void* p2))//cmp是要传的比较函数的参数
//{
//	//冒泡排序
//	//躺数
//	for (int i = 0; i < len; i++)
//	{
//		//排一个最大或最小数
//		for (int j = 0; j < len - i - 1; j++)
//		{
//			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)//调用比较函数比较前后两个字节（可能是字符），选择升降序
//			{
//				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
//			}
//		}
//	}
//}
//
//int main()
//{
//	int arr[] = { 2,6,7,1,8,9,10,5,4,3 };
//	int len = sizeof(arr) / sizeof(arr[0]);
//	my_qsort(arr, len, sizeof(arr[0]), cmp_int);
//
//	for (int i = 0; i < len; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Stu
{
    char name[20];
    int age;
};

//比较函数-年龄
int cmp_by_age(const void* p1, const void* p2)
{
    return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}

//比较函数-姓名
int cmp_by_name(const void* p1, const void* p2)
{
    return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}


//交换函数
void Swap(char* buf1, char* buf2, size_t width)
{
    //一次交换一个字节（可能是字符）
    for (int i = 0; i < width; i++)
    {
        char tmp = *buf1;
        *buf1 = *buf2;
        *buf2 = tmp;
        buf1++;
        buf2++;
    }
}

//模拟qsort函数
void my_qsort(void* base, size_t len, size_t width, int(*cmp)(const void* p1, const void* p2))//cmp是要传的比较函数的参数
{
    //冒泡排序
    //躺数
    for (int i = 0; i < len; i++)
    {
        //排一个最大或最小数
        for (int j = 0; j < len - i - 1; j++)
        {
            if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)//调用比较函数比较前后两个字节（可能是字符），选择升降序
            {
                Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
            }
        }
    }
}

int main()
{
    struct Stu arr[3] = { {"zhangsan",20},{"lisi",35},{"wangwu",18} };
    int len = sizeof(arr) / sizeof(arr[0]);
    my_qsort(arr, len, sizeof(arr[0]), cmp_by_age);

    for (int i = 0; i < len; i++)
    {
        printf("Name: %s, Age: %d\n", arr[i].name, arr[i].age);
    }
    return 0;
}
